package com.ruoyi.system.service;

import java.util.List;
import java.util.Set;

import com.ruoyi.common.core.domain.TreeSelect;
import com.ruoyi.common.core.domain.entity.SysMenu;
import com.ruoyi.system.domain.vo.RouterVo;

/**
 * 菜单 业务层
 *
 * @author ruoyi
 */
public interface ISysMenuService {
    /**
     * 根据用户查询系统菜单列表
     *
     * @param userId 用户ID
     * @return 菜单列表
     */
    public List<SysMenu> selectMenuList(Long userId);

    /**
     * 根据用户查询系统菜单列表（带条件）
     *
     * @param menu   菜单信息查询条件
     * @param userId 用户ID
     * @return 符合条件的菜单列表
     */
    public List<SysMenu> selectMenuList(SysMenu menu, Long userId);

    /**
     * 根据用户ID查询权限字符串集合
     *
     * @param userId 用户ID
     * @return 权限标识集合
     */
    public Set<String> selectMenuPermsByUserId(Long userId);

    /**
     * 根据角色ID查询权限字符串集合
     *
     * @param roleId 角色ID
     * @return 权限标识集合
     */
    public Set<String> selectMenuPermsByRoleId(Long roleId);

    /**
     * 根据用户ID查询菜单树结构数据
     *
     * @param userId 用户ID
     * @return 菜单树结构列表
     */
    public List<SysMenu> selectMenuTreeByUserId(Long userId);

    /**
     * 根据角色ID查询该角色已分配的菜单ID列表
     *
     * @param roleId 角色ID
     * @return 已分配菜单ID列表
     */
    public List<Long> selectMenuListByRoleId(Long roleId);

    /**
     * 构建前端路由所需的菜单路由信息
     *
     * @param menus 菜单列表
     * @return 路由信息列表
     */
    public List<RouterVo> buildMenus(List<SysMenu> menus);

    /**
     * 构建菜单树结构用于展示层级关系
     *
     * @param menus 原始菜单列表
     * @return 树形结构菜单列表
     */
    public List<SysMenu> buildMenuTree(List<SysMenu> menus);

    /**
     * 构建前端下拉选择框所需的树形结构数据
     *
     * @param menus 菜单列表
     * @return 下拉树结构数据列表
     */
    public List<TreeSelect> buildMenuTreeSelect(List<SysMenu> menus);

    /**
     * 根据菜单ID获取菜单详细信息
     *
     * @param menuId 菜单ID
     * @return 菜单信息对象
     */
    public SysMenu selectMenuById(Long menuId);

    /**
     * 判断指定菜单是否存在子节点
     *
     * @param menuId 菜单ID
     * @return true 存在子节点，false 不存在
     */
    public boolean hasChildByMenuId(Long menuId);

    /**
     * 检查菜单是否被角色关联使用
     *
     * @param menuId 菜单ID
     * @return true 被使用，false 未被使用
     */
    public boolean checkMenuExistRole(Long menuId);

    /**
     * 插入新的菜单信息到数据库
     *
     * @param menu 要插入的菜单信息
     * @return 受影响的记录数
     */
    public int insertMenu(SysMenu menu);

    /**
     * 更新菜单信息
     *
     * @param menu 要更新的菜单信息
     * @return 受影响的记录数
     */
    public int updateMenu(SysMenu menu);

    /**
     * 根据菜单ID删除菜单信息
     *
     * @param menuId 要删除的菜单ID
     * @return 受影响的记录数
     */
    public int deleteMenuById(Long menuId);

    /**
     * 校验菜单名称是否唯一（不包括自身）
     *
     * @param menu 包含菜单名称和ID的对象
     * @return true 唯一，false 不唯一
     */
    public boolean checkMenuNameUnique(SysMenu menu);
}
